//
//  UITextView+Emoticon.swift
//  05-表情键盘
//
//  Created by kimbo on 15/12/31.
//  Copyright © 2015年 kimbo. All rights reserved.
//

import UIKit

extension UITextView {
    
    /// 获取textView中带表情图片的文本
    func emoticonText() -> String {
        var textM = ""
        // 表情图片会分段保存在textView.attributedText里面,需要分段获取,拼接起来
        attributedText.enumerateAttributesInRange(NSRange(location: 0, length: attributedText.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) { (result, range, _) -> Void in
            // 如果result 字典里面包含 NSAttachment key就是一个图片,其他情况直接截取文本
            if let attachment = result["NSAttachment"] as? KBTextAttachment {
                //需要获取到附件图片的名称
                textM += attachment.chs!
            } else {
                let text = (self.attributedText.string as NSString).substringWithRange(range)
                
                textM += text
            }
        }
        return textM
    }
    
    /// 把点击的表情插到textView上
    func insertEmoticon(emoticon: KBEmoticon) {
        
        //1 所有表情点击后都会到这里，在这里判断是否点击删除按钮
        if emoticon.removeEmoticon {
            //点击删除按钮，删除内容
            deleteBackward()
        }
        
        //2 如果是emoji表情，直接插入
        if let emoji = emoticon.emoji {
            insertText(emoji)
            return
        }
        
        //3 如果是表情图片,用附件插入
        if let pngPath = emoticon.pngString {
            // 创建附件
            let attachment = KBTextAttachment()
            
            // 给附件添加图片
            attachment.image = UIImage(contentsOfFile: pngPath)
            
            // 设置附件图片名称
            attachment.chs = emoticon.chs
            
            // 设置图片的bounds
            let width = font!.lineHeight
            attachment.bounds = CGRectMake(0, -(width * 0.2), width, width)
            
            // 把附件转换为属性文本
            let attrText = NSMutableAttributedString(attributedString: NSAttributedString(attachment: attachment))
            
            // 注：在添加图片后发现连续添加图片，图片会变小(因为附件缺少font属性)
            attrText.addAttribute(NSFontAttributeName, value: font!, range: NSRange(location: 0, length: 1))
            
            // 获取当前属性文本，转换成可变属性文本
            let currentAttrText = NSMutableAttributedString(attributedString: attributedText)
            
            // 获取当前选中位置
            let sRange = selectedRange
            
            // 将图片替换到现有属性文本
            currentAttrText.replaceCharactersInRange(sRange, withAttributedString: attrText)
            
            // 赋值当前属性文本
            attributedText = currentAttrText
            
            // 设置光标位置
            selectedRange = NSRange(location: sRange.location + 1, length: 0)
            
            // 插入图片没有触发textViewDidChange事件(主动触发)
            /* 通知 */
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self)
            /* 代理 */
            self.delegate?.textViewDidChange!(self)
        }
    }
}



